package com.atguigu.service.service_msm.controller;

import com.atguigu.commonutils.R;
import com.atguigu.commonutils.jwt.RandomUtil;
import com.atguigu.service.service_msm.service.EmailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @description:
 * @author: Administrator
 * @date: 2021-04-12 10:35
 */
@RestController
@RequestMapping("/edu_msm/emailsend")
@CrossOrigin
@Api(tags = "邮箱管理管理接口API")
public class EmailController {


    @Autowired
    private EmailService emailService;

    //Spring-data-redis是spring大家族的一部分，
    // 提供了在srping应用中通过简单的配置访问redis服务
    // ，对reids底层开发包(Jedis, JRedis, and RJC)
    // 进行了高度封装，RedisTemplate提供了redis***各种操作***crud、
    // 异常处理及序列化，支持发布订阅，并对spring 3.1 cache进行了实现。
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @ApiOperation(value="邮箱发送验证码",notes = "测试邮箱: 13918471632@163.com")
    @PostMapping("/send/{emailTo}")
      public R sendEmailMesssage(@PathVariable String emailTo) {
        String code=redisTemplate.opsForValue().get(emailTo);
        //有验证码直接获取，意思就是验证码还能用，给个友好提示
        if(!StringUtils.isEmpty(code)){
            return  R.ok().data("code",code).message("30秒后过期，请尽快填写，进行注册");
        }
        //没验证码，请求邮箱接口。。。等吧不花钱就是慢
        code = RandomUtil.getFourBitRandom();
        Map<String,Object> map= emailService.sendEmailMesssage(code,emailTo);
           /*下面操作一样，取出key，但是设置值和过期时间用了两步操作，多并发有问题。
           可以将设置值和过期时间合并成一步操作，所以可以使用redis的设置值set的另外一个方法
           redisTemplate.opsForValue().set("code",code);
           redisTemplate.expire("code",5,TimeUnit.MINUTES);*/
        //请求中进行判断，map中有参数发送成功，设置过期时间,10分钟
        redisTemplate.opsForValue().set(emailTo,code,10,TimeUnit.MINUTES);
        return  R.ok().data("emailTo",emailTo).data("code",code);
    }
}
